package com.lwl.shua.class02;

import java.util.Arrays;
import java.util.TreeMap;

/**
 * @author lwl
 * @Description 你有 n 个工作和 m 个工人。给定三个数组： difficulty, profit 和 worker ，其中:
 * <p>
 * difficulty[i] 表示第 i 个工作的难度，profit[i] 表示第 i 个工作的收益。
 * worker[i] 是第 i 个工人的能力，即该工人只能完成难度小于等于 worker[i] 的工作。
 * 每个工人 最多 只能安排 一个 工作，但是一个工作可以 完成多次 。
 * <p>
 * 举个例子，如果 3 个工人都尝试完成一份报酬为 $1 的同样工作，那么总收益为 $3 。如果一个工人不能完成任何工作，他的收益为 $0 。
 * 返回 在把工人分配到工作岗位后，我们所能获得的最大利润 。
 * @date 2025/9/6 16:37
 */
public class Code01Lc826MaxProfitAssignment {
    static class Job {
        int difficulty;
        int profit;

        public Job(int difficulty, int profit) {
            this.difficulty = difficulty;
            this.profit = profit;
        }
    }

    public static int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
        Job[] jobs = new Job[difficulty.length];
        for (int i = 0; i < difficulty.length; i++) {
            jobs[i] = new Job(difficulty[i], profit[i]);
        }
        Arrays.sort(jobs, (j1, j2) -> j1.difficulty == j2.difficulty ? (j2.profit - j1.profit) : (j1.difficulty - j2.difficulty));
        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
        treeMap.put(jobs[0].difficulty, jobs[0].profit);
        Job preJob = jobs[0];
        for (int i = 1; i < jobs.length; i++) {
            if (preJob.difficulty <= jobs[i].difficulty && preJob.profit < jobs[i].profit) {
                treeMap.put(jobs[i].difficulty, jobs[i].profit);
                preJob = jobs[i];
            }
        }
        int res = 0;
        for (int i = 0; i < worker.length; i++) {
            Integer key = treeMap.floorKey(worker[i]);
            res += key == null ? 0 : treeMap.get(key);
        }
        return res;
    }
}
